跳到主要内容

剑指 Offer 42. 连续子数组的最大和

easy

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为 O(n)。

示例1:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

DP

用 dp(i) 代表以第 i 个数结尾的「连续子数组的最大和」

dp(i) = max{ dp(i−1) + nums[i], nums[i] }

func maxSubArray(nums []int) int {
dp := make([]int, len(nums))
dp[0] = nums[0]
maxResult := dp[0]
for i := 1; i < len(nums); i++ {
if dp[i-1]+nums[i] > nums[i] {
dp[i] = dp[i-1] + nums[i]
} else {
dp[i] = nums[i]
}
if dp[i] > maxResult {
maxResult = dp[i]
}
}
return maxResult
}

更简便的方法

因为 dp[i] 只与 dp[i-1] 相关,所以用一个 pre 变量接住 dp[i-1] 将空间复杂度降至 O(1)

func maxSubArray(nums []int) int {
maxResult := nums[0]
pre := nums[0]
for i := 1; i < len(nums); i++ {
if pre > 0 {
pre = pre + nums[i]
} else {
pre = nums[i]
}
if pre > maxResult {
maxResult = pre
}
}
return maxResult
}